package com.suisui.util;


import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;

public class MessageDigestUtils {
    private static final String UTF8 = StandardCharsets.UTF_8.name();
    /**
     * 执行消息摘要
     * @param originalContent 原始字符串
     * @param algorithm 算法名字，如MD5
     * @return
     */
    public static String doDigest(String originalContent,String algorithm ) {
        try {
            //获取消息摘要算法对象
            MessageDigest md = MessageDigest.getInstance(algorithm);
            //获取原始内容的字节数组
            byte[] originalBytes = originalContent.getBytes(UTF8);
            //获取到摘要结果
            byte[] digestBytes = md.digest(originalBytes);
            //当originalBytes比较大时，循环切分
            // md.update(originalBytes);
            // md.digest();
            //System.out.println(new String(digestBytes,UTF8));//乱码
            //把每一个字节转换为16进制字符，最终在拼接起来这16进制字符
            String hexStr = HexUtils.convertBytes2HexStr(digestBytes);
            return hexStr;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 获取mac的消息摘要
     * @param originalContent 原始内容
     * @param algorithm 算法名字
     * @param key mac算法的Key
     * @return
     */
    public static String doDigestMac(String originalContent,String algorithm,String key) {
        try {
            //获取消息摘要算法对象
            Mac mac = Mac.getInstance(algorithm);
            //获取key对象并初始化mac
            SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(UTF8), algorithm);
            mac.init(secretKey);
            //获取原始内容的字节数组
            byte[] originalBytes = originalContent.getBytes(UTF8);
            //获取到摘要结果
            byte[] digestBytes = mac.doFinal(originalBytes);
            //把每一个字节转换为16进制字符，最终在拼接起来这16进制字符
            String hexStr = HexUtils.convertBytes2HexStr(digestBytes);
            return hexStr;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
